home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / Palettes / MailComposer / UsingMailComposerPalette / MailComposer.m < prev    next >
Text File  |  1995-06-12  |  9KB  |  346 lines

  1. //----------------------------------------------------------------------------------------------------
  2. //
  3. //    MailComposer
  4. //
  5. //    Inherits From:        Object
  6. //
  7. //    Declared In:        MailComposer.h
  8. //
  9. //    Disclaimer
  10. //
  11. //        You may freely copy, distribute and reuse this software and its
  12. //        associated documentation. I disclaim any warranty of any kind, 
  13. //        expressed or implied, as to its fitness for any particular use.
  14. //
  15. //----------------------------------------------------------------------------------------------------
  16. #import "MailComposer.h"
  17. #import "MailSpeaker.h"
  18.  
  19.  
  20. @implementation MailComposer
  21.  
  22. //---------------------------------------------------------------------------------------------------------
  23. //    Private Methods
  24. //---------------------------------------------------------------------------------------------------------
  25. - (BOOL)_setPort
  26. {
  27.     //  Should call this before any remote message to make sure Mail.app is
  28.     //  running and mailSpeaker's port is current.  Get named port 'Mail'.  
  29.     //  This will launch Mail.app if not already.  Get named port 'MailSendDemo'  
  30.     //  (this is the one we will actually talk to).  Set mailSpeaker's port to be this one. 
  31.     
  32.         port_t     mailPort = NXPortFromName ("Mail", NULL);
  33.  
  34.     if (mailPort == PORT_NULL) 
  35.         {
  36.         (NXRunAlertPanel ("Accessing Mail", "Unable to connect to Mail.app",  
  37.             NULL,  NULL, NULL));
  38.         return NO;
  39.         }
  40.         
  41.     mailPort = NXPortFromName ("MailSendDemo", NULL);
  42.  
  43.     if (mailPort == PORT_NULL) 
  44.         {
  45.         (NXRunAlertPanel ("Accessing Mail", "Unable to connect to Mail.app",  
  46.             NULL,  NULL, NULL));
  47.         return NO;
  48.         }
  49.         
  50.         [mailSpeaker setSendPort: mailPort];
  51.     return YES;
  52. }
  53.  
  54.     
  55. - _nextText: sender
  56. {
  57.     //  This method attempts to help manage the UI flow, by moving to
  58.     //  a TextField's nextText object when possible.  This is currently only possible
  59.     //  by 'tabbing', but tabbing doesn't send an action.  This method will 
  60.     //  allow an action to be sent and nextText to be selected when 'return' is
  61.     //  entered.  Only works with TextFields and TextField subclasses.  Used by
  62.     //  'takeFrom' methods.
  63.  
  64.     if ([sender isKindOf: [TextField class]]) 
  65.         if ([[sender nextText] respondsTo: @selector(selectText:)])
  66.             [[sender nextText] selectText:nil];
  67.  
  68.     return self;
  69. }
  70.  
  71.  
  72. //---------------------------------------------------------------------------------------------------------
  73. //    Initializing and Freeing
  74. //---------------------------------------------------------------------------------------------------------
  75. - init
  76. {
  77.     [super init];
  78.     mailSpeaker = [[MailSpeaker alloc] init];
  79.     return self;
  80. }
  81.  
  82.  
  83. - free
  84. {
  85.     if (to)  free (to);
  86.     if (subject)  free (subject);
  87.     if (cc)  free (cc);
  88.     if (body)  free (body);
  89.     if (mailSpeaker) [mailSpeaker free];
  90.     return [super free];
  91. }
  92.  
  93.     
  94. //---------------------------------------------------------------------------------------------------------
  95. //    Accessor Methods
  96. //---------------------------------------------------------------------------------------------------------
  97. - (STR) to
  98. {
  99.     return to;
  100. }
  101.  
  102. - (STR) subject
  103. {
  104.     return subject;
  105. }
  106.  
  107. - (STR) cc
  108. {
  109.     return cc;
  110. }
  111.  
  112. - (STR) body
  113. {
  114.     return body;
  115. }
  116.  
  117. - to: (STR) aString
  118. {
  119.     if (! aString) return self;
  120.     if (to)  free (to);
  121.     to = NXCopyStringBuffer (aString);
  122.     return self;
  123. }
  124.  
  125. - subject: (STR) aString
  126. {
  127.     if (! aString) return self;
  128.     if (subject)  free (subject);
  129.     subject = NXCopyStringBuffer (aString);
  130.     return self;
  131. }
  132.  
  133. - cc: (STR) aString
  134. {
  135.     if (! aString) return self;
  136.     if (cc)  free (cc);
  137.     cc = NXCopyStringBuffer (aString);
  138.     return self;
  139. }
  140.  
  141. - body: (STR) aString
  142. {
  143.     if (! aString) return self;
  144.     if (body)  free (body);
  145.     body = NXCopyStringBuffer (aString);
  146.     return self;
  147. }
  148.  
  149.  
  150. //---------------------------------------------------------------------------------------------------------
  151. //    Action Methods
  152. //---------------------------------------------------------------------------------------------------------
  153. - takeToStringValueFrom: sender
  154. {
  155.     [self to: (STR)[sender stringValue]];
  156.     [self _nextText: sender];
  157.     return self;
  158. }
  159.  
  160. - takeSubjectStringValueFrom: sender
  161. {
  162.     [self subject: (STR)[sender stringValue]];
  163.     [self _nextText: sender];
  164.     return self;
  165. }
  166.  
  167. - takeCcStringValueFrom: sender
  168. {
  169.     [self cc: (STR)[sender stringValue]];
  170.     [self _nextText: sender];
  171.     return self;
  172. }
  173.  
  174. - takeBodyStringValueFrom: sender
  175. {
  176.     [self body: (STR)[sender stringValue]];
  177.     [self _nextText: sender];
  178.     return self;
  179. }
  180.  
  181. - takeRemoteToStringValueFrom: sender
  182. {
  183.     //  Set To: field in compose window using sender stringValue.
  184.     
  185.     if (! [self _setPort]) return nil;
  186.     [mailSpeaker setTo: (STR)[sender stringValue]];
  187.     [self _nextText: sender];
  188.     return self;
  189. }
  190.  
  191. - takeRemoteSubjectStringValueFrom: sender
  192. {
  193.     //  Set Subject: field in compose window using sender stringValue.
  194.     
  195.     if (! [self _setPort]) return nil;
  196.     [mailSpeaker setSubject: (STR)[sender stringValue]];
  197.     [self _nextText: sender];
  198.     return self;
  199. }
  200.  
  201. - takeRemoteCcStringValueFrom: sender
  202. {
  203.     //  Set Cc: field in compose window using sender stringValue.
  204.     
  205.     if (! [self _setPort]) return nil;
  206.     [mailSpeaker setCc: (STR)[sender stringValue]];
  207.     [self _nextText: sender];
  208.     return self;
  209. }
  210.  
  211. - takeRemoteBodyStringValueFrom: sender
  212. {
  213.     //  Set letter body in compose window using sender stringValue.
  214.     
  215.     if (! [self _setPort]) return nil;
  216.     [mailSpeaker setBody: (STR)[sender stringValue]];
  217.     [self _nextText: sender];
  218.     return self;
  219. }
  220.  
  221. - remoteOpen: sender
  222. {
  223.     //  Open a compose window in Mail.  Multiple calls to this method
  224.     //  will open multiple windows.  However, all other methods will write
  225.     //  to the 'oldest' open window.  For example , if 3 windows are opened,
  226.     //  window 1 will be written to until it is closed/delivered, at that point 
  227.     //  window 2 will be written to.  (Being a 'key' window has no affect
  228.     //  on this ordering).
  229.                 
  230.     if (! [self _setPort]) return nil;
  231.     [mailSpeaker openSend];
  232.     return self;
  233. }
  234.  
  235. - remoteTo: sender
  236. {
  237.     //  Set To: field in compose window using instance variable.
  238.     
  239.     if (! [self _setPort]) return nil;
  240.     if (to) [mailSpeaker setTo: to];
  241.     return self;
  242. }
  243.     
  244. - remoteSubject: sender
  245. {
  246.     //  Set Subject: field in compose window using instance variable.
  247.     
  248.     if (! [self _setPort]) return nil;
  249.     if (subject) [mailSpeaker setSubject: subject];
  250.     return self;
  251. }
  252.     
  253. - remoteCc: sender
  254. {
  255.     //  Set Cc: field in compose window using instance variable.
  256.     
  257.     if (! [self _setPort]) return nil;
  258.     if (cc) [mailSpeaker setCc: cc];
  259.     return self;
  260. }
  261.     
  262. - remoteBody: sender
  263. {
  264.     //  Set letter body in compose window using instance variable.
  265.     
  266.     if (! [self _setPort]) return nil;
  267.     if (body) [mailSpeaker setBody: body];
  268.     return self;
  269. }
  270.     
  271. - remoteCompose: sender
  272. {
  273.     //  Sets all fields in compose window.  If a window  is not yet opened
  274.     //  first remote call will open.  If a window already exists, this method will 
  275.     //  overwrite its fields.
  276.     
  277.     [self remoteTo: nil];
  278.     [self remoteSubject: nil];
  279.     [self remoteCc: nil];
  280.     [self remoteBody: nil];
  281.     return self;
  282. }
  283.  
  284. - remoteDeliver: sender
  285. {
  286.     //  Delivers the compose window.  If no window has been opened, 
  287.     //  this method has no affect.  Mail.app will present an Alert panel if
  288.     //  invalid 'To:' data exists in compose window.
  289.     
  290.     if (! [self _setPort]) return nil;
  291.     [mailSpeaker deliver];
  292.     return self;
  293. }
  294.  
  295. - remoteComposeAndDeliver: sender
  296. {
  297.     //  Sets all fields in compose window and delivers.  If a window  is not yet 
  298.     //  opened first remote call will open.  If a window already exists, this method 
  299.     //  will overwrite its fields.  Mail.app will present an Alert panel if invalid 'To:'
  300.     //  data exists in the compose window.
  301.  
  302.     [self remoteCompose: nil];
  303.     [self remoteDeliver: nil];
  304.     return self;
  305. }
  306.  
  307.  
  308. //---------------------------------------------------------------------------------------------------------
  309. //    Archiving
  310. //---------------------------------------------------------------------------------------------------------
  311. - read: (NXTypedStream*) aStream
  312. {
  313.     [super read: aStream];
  314.     NXReadTypes (aStream, "@****", &mailSpeaker, &to, &subject, &cc, &body);
  315.     return self;
  316. }
  317.  
  318. - write: (NXTypedStream*) aStream
  319. {
  320.     [super write: aStream];
  321.     NXWriteTypes (aStream, "@****", &mailSpeaker, &to, &subject, &cc, &body);
  322.     return self;
  323. }
  324.  
  325.  
  326. //---------------------------------------------------------------------------------------------------------
  327. //    IB Methods
  328. //---------------------------------------------------------------------------------------------------------
  329. - (const char *)getInspectorClassName
  330. {
  331.     //  This returns the name of the class responsible for managing a custom 
  332.     //  IB Attributes inspector.
  333.         
  334.         return "MailComposerInspector";
  335. }
  336.  
  337. - (NXImage*) getIBImage
  338. {
  339.     //  This returns the NXImage instance that will be displayed in IB's File Viewer
  340.     //  when this class is instantiated.
  341.  
  342.     return [NXImage findImageNamed: "MailComposerIcon"];
  343. }
  344.  
  345.  
  346. @end